package com.company.reentrant;

/**
 * 可重入性：
 *      指的是同一个线程获得锁之后，可以直接再次获得该锁。
 * 1. 自定义一个线程类
 * 2. 在线程类的 run 方法中，使用嵌套的同步代码块
 * 3. 使用两个线程来执行
 */
public class Reentrant {
    public static void main(String[] args) throws InterruptedException {

        Runnable sellTicket = new Runnable() {
            @Override
            public void run() {
                synchronized (Reentrant.class) {
                    System.out.println(Thread.currentThread().getName() + " 我是run");
                    test01();
                }
            }

            public void test01() {
                synchronized (Reentrant.class) {
                    System.out.println(Thread.currentThread().getName() + " 我是test01");
                }
            }
        };

        new Thread(sellTicket).start();
        Thread.sleep(2000);
        new Thread(sellTicket).start();
    }
}

/**
 * 小结：
 *  synchronized是可重入锁，内部锁对象中会有一个计数器记录线程获取几次锁啦，在执行完同步代码块时，计数器的数量会-1，知道计数器的数量为0，就释放这个锁。
 */